home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / a_utils / _archvrs / unix / lha101u / src / lharc.h < prev    next >
C/C++ Source or Header  |  1992-04-24  |  10KB  |  394 lines

  1. /*----------------------------------------------------------------------*/
  2. /*        LHarc Archiver Driver for UNIX                */
  3. /*                                    */
  4. /*        Copyright(C) MCMLXXXIX  Yooichi.Tagawa            */
  5. /*                                    */
  6. /*  V1.00  Fixed                1989.09.22  Y.Tagawa    */
  7. /*  V0.03  LHa for UNIX                1991.12.18  M.Oki    */
  8. /*----------------------------------------------------------------------*/
  9.  
  10. #include <stdio.h>
  11. #include <ctype.h>
  12. #include <sys/types.h>
  13. #include <sys/file.h>
  14. #include <sys/stat.h>
  15.  
  16. #include <signal.h>
  17.  
  18. /* most of System V,  define SYSTIME_HAS_NO_TM */
  19. #ifdef SYSTIME_HAS_NO_TM
  20. #include <time.h>
  21. #else
  22. #include <sys/time.h>
  23. #endif
  24.  
  25. /*----------------------------------------------------------------------*/
  26. /*            DIRECTORY ACCESS STUFF                */
  27. /*----------------------------------------------------------------------*/
  28. #ifndef NODIRECTORY
  29. #ifdef SYSV_SYSTEM_DIR
  30.  
  31. #include <dirent.h>
  32. #define DIRENTRY    struct dirent
  33. #define NAMLEN(p)    strlen (p->d_name)
  34.  
  35. #else    /* not SYSV_SYSTEM_DIR */
  36.  
  37. #ifdef NONSYSTEM_DIR_LIBRARY
  38. #include "lhdir.h"
  39. #else
  40. #include <sys/dir.h>
  41. #endif    /* not NONSYSTEM_DIR_LIBRARY */
  42.  
  43. #define DIRENTRY    struct direct
  44. #define NAMLEN(p)    p->d_namlen
  45.  
  46. extern DIR *opendir ();
  47. extern struct direct *readdir ();
  48.  
  49. #endif    /* not SYSV_SYSTEM_DIR */
  50. #endif
  51.  
  52. /*----------------------------------------------------------------------*/
  53. /*                FILE ATTRIBUTES                */
  54. /*----------------------------------------------------------------------*/
  55.  
  56. /* If file mode is not compatible between your Machine/OS and
  57.    LHarc standard UNIX file mode.
  58.    (See UNIX Manual stat(1), <sys/stat.h>,
  59.    and/or below UNIX_* definitions. ) */
  60. /* #define NOT_COMPATIBLE_MODE */
  61. #define is_directory(statp)    (((statp)->st_mode & S_IFMT) == S_IFDIR)
  62. #define is_regularfile(statp)    (((statp)->st_mode & S_IFMT) == S_IFREG)
  63.  
  64. /* #define WRITE_BINARY    "wb" */
  65. /* #define READ_BINARy    "rb" */
  66. #define WRITE_BINARY    "w"
  67. #define READ_BINARY    "r"
  68.  
  69. /*----------------------------------------------------------------------*/
  70. /*            MEMORY AND STRING FUNCTIONS            */
  71. /*----------------------------------------------------------------------*/
  72.  
  73. #ifndef USG
  74. #include <strings.h>
  75. #else
  76. #include <string.h>
  77. #endif    /* USG */
  78.  
  79. #ifdef NOINDEX
  80. #define index strchr
  81. #define rindex strrchr
  82. #endif    /* NOINDEX */
  83.  
  84. #ifdef NOBSTRING
  85. #define bcmp(a,b,n) memcmp ((a),(b),(n))
  86. #define bzero(d,n) memset((d),0,(n))
  87. #define bcopy(s,d,n) memmove((d),(s),(n))
  88. #endif    /* NOBSTRING */
  89.  
  90. #ifdef USESTRCASECMP
  91. #define strucmp(p,q) strcasecmp((p),(q))
  92. #endif
  93.  
  94. /*----------------------------------------------------------------------*/
  95. /*                YOUR CUSTOMIZIES            */
  96. /*----------------------------------------------------------------------*/
  97. /* These definitions are changable to you like.             */
  98. /* #define ARCHIVENAME_EXTENTION        ".LZH"            */
  99. /* #define BACKUPNAME_EXTENTION            ".BAK"            */
  100. /* #define TMP_FILENAME_TEMPLATE        "/usr/tmp/lhXXXXXX"    */
  101. /* #define MULTIBYTE_CHAR                        */
  102. /* #define USE_PROF                            */
  103.  
  104. #ifndef ARCHIVENAME_EXTENTION
  105. #define ARCHIVENAME_EXTENTION    ".lzh"
  106. #endif
  107. #ifndef BACKUPNAME_EXTENTION
  108. #define BACKUPNAME_EXTENTION    ".bak"
  109. #endif
  110. #ifndef TMP_FILENAME_TEMPLATE
  111. #define TMP_FILENAME_TEMPLATE    "/tmp/lhXXXXXX"
  112. #endif
  113.  
  114. #define SJC_FIRST_P(c)            \
  115.   (((unsigned char)(c) >= 0x80) &&    \
  116.    (((unsigned char)(c) < 0xa0) ||    \
  117.     ((unsigned char)(c) >= 0xe0) &&    \
  118.     ((unsigned char)(c) < 0xfd)))
  119. #define SJC_SECOND_P(c)            \
  120.   (((unsigned char)(c) >= 0x40) &&    \
  121.    ((unsigned char)(c) < 0xfd) &&    \
  122.    ((ungigned char)(c) != 0x7f))
  123.  
  124. #ifdef MULTIBYTE_CHAR
  125. #define MULTIBYTE_FIRST_P    SJC_FIRST_P
  126. #define MULTIBYTE_SECOND_P    SJC_SECOND_P
  127. #endif /* MULTIBYTE_CHAR */
  128.  
  129. /*----------------------------------------------------------------------*/
  130. /*            OTHER DIFINITIONS                */
  131. /*----------------------------------------------------------------------*/
  132.  
  133. /* Your C-Compiler has no 'void' */
  134. #ifdef NO_VOID
  135. #define void
  136. #endif
  137.  
  138. #ifndef SEEK_SET
  139. #define SEEK_SET    0
  140. #define SEEK_CUR    1
  141. #define SEEK_END    2
  142. #endif
  143.  
  144. #define FILENAME_LENGTH    1024
  145.  
  146.  
  147. /* non-integral functions */
  148. extern struct tm *localtime ();
  149. extern char *getenv ();
  150.  
  151. #ifndef _MINIX
  152. #ifndef __STDC__
  153. extern char *malloc ();
  154. extern char *realloc ();
  155. #endif
  156. #endif
  157.  
  158. /* external variables */
  159. extern int errno;
  160.  
  161.  
  162. #define    FALSE    0
  163. #define TRUE    1
  164. typedef int boolean;
  165.  
  166.  
  167. /*----------------------------------------------------------------------*/
  168. /*            LHarc FILE DEFINITIONS                */
  169. /*----------------------------------------------------------------------*/
  170. #define METHOD_TYPE_STRAGE    5
  171. #define LZHUFF0_METHOD        "-lh0-"
  172. #define LZHUFF1_METHOD        "-lh1-"
  173. #define LZHUFF2_METHOD        "-lh2-"
  174. #define LZHUFF3_METHOD        "-lh3-"
  175. #define LZHUFF4_METHOD        "-lh4-"
  176. #define LZHUFF5_METHOD        "-lh5-"
  177. #define LARC4_METHOD        "-lz4-"
  178. #define LARC5_METHOD        "-lz5-"
  179. #define LZHDIRS_METHOD        "-lhd-"
  180.  
  181. #define I_HEADER_SIZE            0
  182. #define I_HEADER_CHECKSUM        1
  183. #define I_METHOD            2
  184. #define I_PACKED_SIZE            7
  185. #define I_ORIGINAL_SIZE            11
  186. #define I_LAST_MODIFIED_STAMP        15
  187. #define I_ATTRIBUTE            19
  188. #define I_HEADER_LEVEL            20
  189. #define I_NAME_LENGTH            21
  190. #define I_NAME                22
  191.  
  192. #define I_CRC                22 /* + name_length */
  193. #define I_EXTEND_TYPE            24 /* + name_length */
  194. #define I_MINOR_VERSION            25 /* + name_length */
  195. #define I_UNIX_LAST_MODIFIED_STAMP    26 /* + name_length */
  196. #define I_UNIX_MODE            30 /* + name_length */
  197. #define I_UNIX_UID            32 /* + name_length */
  198. #define I_UNIX_GID            34 /* + name_length */
  199. #define I_UNIX_EXTEND_BOTTOM        36 /* + name_length */
  200.  
  201. #define I_GENERIC_HEADER_BOTTOM        I_EXTEND_TYPE
  202.  
  203.  
  204.  
  205. #define EXTEND_GENERIC        0
  206. #define EXTEND_UNIX        'U'
  207. #define EXTEND_MSDOS        'M'
  208. #define EXTEND_MACOS        'm'
  209. #define EXTEND_OS9        '9'
  210. #define EXTEND_OS2        '2'
  211. #define EXTEND_OS68K        'K'
  212. #define EXTEND_OS386        '3'        /* OS-9000??? */
  213. #define EXTEND_HUMAN        'H'
  214. #define EXTEND_CPM        'C'
  215. #define EXTEND_FLEX        'F'
  216. #define EXTEND_RUNSER        'R'
  217. /*    this OS type is not official */
  218. #define EXTEND_TOWNSOS        'T'
  219. #define EXTEND_XOSK        'X'
  220. /*------------------------------*/
  221.  
  222. #define GENERIC_ATTRIBUTE            0x20
  223. #define GENERIC_DIRECTORY_ATTRIBUTE        0x10
  224. #define HEADER_LEVEL0                0x00
  225. #define HEADER_LEVEL1                0x01
  226. #define HEADER_LEVEL2                0x02
  227.  
  228. #define CURRENT_UNIX_MINOR_VERSION        0x00
  229.  
  230. #define DELIM ('/')
  231. #define DELIM2 (0xff)
  232. #define DELIMSTR "/"
  233.  
  234.  
  235. typedef struct LzHeader {
  236.   unsigned char        header_size;
  237.   char            method[METHOD_TYPE_STRAGE];
  238.   long            packed_size;
  239.   long            original_size;
  240.   long            last_modified_stamp;
  241.   unsigned char    attribute;
  242.   unsigned char header_level;
  243.   char            name[256];
  244.   unsigned short    crc;
  245.   boolean        has_crc;
  246.   unsigned char        extend_type;
  247.   unsigned char        minor_version;
  248.   /*  extend_type == EXTEND_UNIX  and convert from other type. */
  249.   time_t        unix_last_modified_stamp;
  250.   unsigned short    unix_mode;
  251.   unsigned short    unix_uid;
  252.   unsigned short    unix_gid;
  253. } LzHeader;
  254.  
  255. #define OSK_RW_RW_RW            0000033
  256. #define OSK_FILE_REGULAR        0000000
  257. #define OSK_DIRECTORY_PERM        0000200
  258. #define OSK_SHARED_PERM            0000100
  259. #define OSK_OTHER_EXEC_PERM        0000040
  260. #define OSK_OTHER_WRITE_PERM        0000020
  261. #define OSK_OTHER_READ_PERM        0000010
  262. #define OSK_OWNER_EXEC_PERM        0000004
  263. #define OSK_OWNER_WRITE_PERM        0000002
  264. #define OSK_OWNER_READ_PERM        0000001
  265.  
  266. #define UNIX_FILE_TYPEMASK        0170000
  267. #define UNIX_FILE_REGULAR        0100000
  268. #define UNIX_FILE_DIRECTORY        0040000
  269. #define UNIX_SETUID            0004000
  270. #define UNIX_SETGID            0002000
  271. #define UNIX_STYCKYBIT            0001000
  272. #define UNIX_OWNER_READ_PERM        0000400
  273. #define UNIX_OWNER_WRITE_PERM        0000200
  274. #define UNIX_OWNER_EXEC_PERM        0000100
  275. #define UNIX_GROUP_READ_PERM        0000040
  276. #define UNIX_GROUP_WRITE_PERM        0000020
  277. #define UNIX_GROUP_EXEC_PERM        0000010
  278. #define UNIX_OTHER_READ_PERM        0000004
  279. #define UNIX_OTHER_WRITE_PERM        0000002
  280. #define UNIX_OTHER_EXEC_PERM        0000001
  281. #define UNIX_RW_RW_RW            0000666
  282.  
  283. #define LZHEADER_STRAGE            4096
  284.  
  285. #ifdef S_IFLNK
  286. #define GETSTAT lstat
  287. #else
  288. #define GETSTAT stat
  289. #endif
  290.  
  291. /* used by qsort() for alphabetic-sort */
  292. #define STRING_COMPARE(a,b) strcmp((a),(b))
  293.  
  294. struct string_pool {
  295.   int used;
  296.   int size;
  297.   int n;
  298.   char *buffer;
  299. };
  300.  
  301.  
  302. /*----------------------------------------------------------------------*/
  303. /*                OPTIONS                    */
  304. /*----------------------------------------------------------------------*/
  305.  
  306. /* command line options (common options) */
  307. extern boolean    quiet;
  308. extern boolean    text_mode;
  309. extern boolean    verbose;
  310. extern boolean    noexec;        /* debugging option */
  311. extern boolean    force;
  312. extern boolean    prof;
  313. extern boolean    delete_after_append;
  314.  
  315. /* list command flags */
  316. extern boolean    verbose_listing;
  317.  
  318. /* extract/print command flags */
  319. extern boolean    output_to_stdout;
  320.  
  321. /* add/update/delete command flags */
  322. extern boolean    new_archive;
  323. extern boolean    update_if_newer;
  324. extern boolean    generic_format;
  325.  
  326.  
  327. /*----------------------------------------------------------------------*/
  328. /*                VARIABLES                */
  329. /*----------------------------------------------------------------------*/
  330.  
  331. extern char    **cmd_filev;
  332. extern int    cmd_filec;
  333.  
  334. extern char    *archive_name;
  335. extern char    expanded_archive_name[FILENAME_LENGTH];
  336. extern char    temporary_name[FILENAME_LENGTH];
  337. extern char    backup_archive_name[FILENAME_LENGTH];
  338.  
  339. extern char *reading_filename, *writting_filename;
  340. extern boolean    remove_temporary_at_error;
  341. extern boolean    recover_archive_when_interrupt;
  342. extern boolean    remove_extracting_file_when_interrupt;
  343.  
  344. extern int    archive_file_mode;
  345. extern int    archive_file_gid;
  346.  
  347. /*----------------------------------------------------------------------*/
  348. /*                Functions                */
  349. /*----------------------------------------------------------------------*/
  350.  
  351. extern void interrupt ();
  352.  
  353. extern void message ();
  354. extern void warning ();
  355. extern void error ();
  356. extern void fatal_error ();
  357.  
  358. extern boolean need_file ();
  359. extern int inquire ();
  360. extern FILE *xfopen ();
  361.  
  362. extern boolean find_files ();
  363. extern void free_files ();
  364.  
  365. extern void init_sp ();
  366. extern void add_sp ();
  367. extern void finish_sp ();
  368. extern void free_sp ();
  369. extern void cleaning_files ();
  370.  
  371. extern void build_temporary_name ();
  372. extern void build_backup_file_name ();
  373. extern void build_standard_archive_name ();
  374.  
  375. extern FILE *open_old_archive ();
  376. extern void init_header ();
  377. extern boolean get_header ();
  378. extern boolean archive_is_msdos_sfx1 ();
  379. extern boolean skip_msdos_sfx1_code ();
  380. extern void write_header ();
  381. extern void write_archive_tail ();
  382. extern void copy_old_one ();
  383. extern unsigned char *convdelim ();
  384. extern long copyfile ();
  385.  
  386. extern void cmd_list (), cmd_extract (), cmd_add (), cmd_delete ();
  387.  
  388. extern boolean ignore_directory;
  389. extern boolean compress_method;
  390. extern boolean verify_mode;
  391.  
  392. extern char *extract_directory;
  393. extern FILE *temporary_fp;
  394.